package com.mindskip.xzs.controller.admin;
//负责处理管理员对问题管理的操作请求。提供了分页获取问题列表、编辑问题（新增或更新）、获取问题详情和删除问题的功能。
//请求接口
//前端调用这些接口来执行问题管理的各种操作，如分页查询问题列表、新增或更新问题、获取问题详情和删除问题。
//每个方法对应一个特定的URL路径，前端通过发送HTTP请求（通常是POST请求）来与这些接口交互。
//数据交互
//前端通过发送带有JSON数据的请求体（`@RequestBody`）来传递所需的参数。
//返回的数据也是JSON格式，前端通过解析响应数据来展示问题信息或确认操作结果。
//`pageList`: 处理分页获取问题列表的请求。调用服务层获取问题信息，并将数据转换为视图模型后返回给前端。
//`edit`: 处理编辑问题（新增或更新）的请求。根据请求数据判断是新增还是更新问题，并调用相应的服务层方法。
//`select`: 处理根据ID获取问题详情的请求。调用服务层获取问题的详细信息并返回给前端。
//`delete`: 处理删除问题的请求。根据问题ID设置问题为已删除状态，并更新数据库记录。
//分页获取问题列表
//  1. 从`QuestionService`中获取分页问题列表。
//  2. 使用`PageInfoHelper.copyMap`方法将问题实体转换为响应视图模型（`QuestionResponseVM`）。
//  3. 获取问题的详细内容，并将JSON格式的内容转换为`QuestionObject`对象。
//  4. 清除HTML标签，设置清理后的标题内容。
//  5. 返回分页信息。
//编辑问题（新增或更新）
//  1. 判断请求数据中的问题ID是否为空。
//  2. 如果ID为空，则调用`questionService.insertFullQuestion`方法新增问题。
//  3. 如果ID不为空，则调用`questionService.updateFullQuestion`方法更新问题。
//  4. 返回操作结果。
//根据ID获取问题详情
//  1. 根据问题ID调用`questionService.getQuestionEditRequestVM`方法获取问题的详细信息。
//  2. 返回问题详情。
//删除问题
//  1. 根据问题ID调用`questionService.selectById`方法获取问题。
//  2. 设置问题为已删除状态。
//  3. 调用`questionService.updateByIdFilter`方法更新问题状态。
//  4. 返回操作结果。
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.Question;
import com.mindskip.xzs.domain.TextContent;
import com.mindskip.xzs.domain.question.QuestionObject;
import com.mindskip.xzs.service.QuestionService;
import com.mindskip.xzs.service.TextContentService;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.HtmlUtil;
import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.question.QuestionResponseVM;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController("AdminQuestionController")
@RequestMapping(value = "/api/admin/question")
public class QuestionController extends BaseApiController {

    private final QuestionService questionService;
    private final TextContentService textContentService;

    @Autowired
    public QuestionController(QuestionService questionService, TextContentService textContentService) {
        this.questionService = questionService;
        this.textContentService = textContentService;
    }
    // 分页获取问题列表的接口
    @RequestMapping(value = "/page", method = RequestMethod.POST)
    public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody QuestionPageRequestVM model) {
        PageInfo<Question> pageInfo = questionService.page(model);// 获取分页问题列表
        PageInfo<QuestionResponseVM> page = PageInfoHelper.copyMap(pageInfo, q -> {
            QuestionResponseVM vm = modelMapper.map(q, QuestionResponseVM.class);// 将问题转换为响应视图模型
            vm.setCreateTime(DateTimeUtil.dateFormat(q.getCreateTime()));// 格式化创建时间
            // 获取问题的详细内容
            TextContent textContent = textContentService.selectById(q.getInfoTextContentId());
            // 将 JSON 格式的内容转换为 QuestionObject 对象
            QuestionObject questionObject = JsonUtil.toJsonObject(textContent.getContent(), QuestionObject.class);
            // 清除 HTML 标签
            String clearHtml = null;
            if (questionObject != null) {
                clearHtml = HtmlUtil.clear(questionObject.getTitleContent());
            }
            vm.setShortTitle(clearHtml); // 设置清理后的标题内容
            return vm;
        });
        return RestResponse.ok(page);// 返回分页信息
    }
    // 编辑问题的接口（新增或更新）
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public RestResponse edit(@RequestBody @Valid QuestionEditRequestVM model) {

        if (null == model.getId()) {
            // 如果 ID 为空则为新增问题
            questionService.insertFullQuestion(model, getCurrentUser().getId());
        } else {
            // 如果 ID 不为空则为更新问题
            questionService.updateFullQuestion(model);
        }

        return RestResponse.ok();
    }
    // 根据 ID 获取问题详情的接口
    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
    public RestResponse<QuestionEditRequestVM> select(@PathVariable Integer id) {
        QuestionEditRequestVM newVM = questionService.getQuestionEditRequestVM(id);
        return RestResponse.ok(newVM);
    }

    // 删除问题的接口
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
    public RestResponse delete(@PathVariable Integer id) {
        Question question = questionService.selectById(id);// 获取问题编辑视图模型
        question.setDeleted(true);// 设置问题为已删除
        questionService.updateByIdFilter(question);// 更新问题状态
        return RestResponse.ok();// 返回成功响应
    }

}
